再帰呼び出し(リカーシブコール)を使ったプログラム
情報処理試験などに出てくる「再帰呼び出し」というプログラム構造のサンプルを作ってみます。
再帰呼び出しとは関数内で再びその関数自身を呼び出すことです。
まずはJavaのサンプルです。指定したフォルダ内のすべてのファイル名をトレースするだけのプログラムです。
サンプルではCドライブ直下にsampleフォルダを作成していますが適当に書き換えて下さい。
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) { try{ File rootDir = new File("C:\\sample"); traceFileName(rootDir); System.out.println("終了");
}catch(IOException e){ System.out.println(e); } }
private static void traceFileName(File file) throws IOException{ if(file.isDirectory()) { System.out.println(file.getName());
File[] files = file.listFiles();
for(int i = 0; i < files.length; i++) {
// 配下のファイルに対してtraceFileNameメソッドを実行
traceFileName(files [i]);
}
} else {
System.out.println(file.getName());
}
}
}[/java]
次はFlexでサンプルを作ってみます。今度はフラットなデータを階層構造のあるデータに変換してTreeのdataProviderに代入します。
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="creationCompleteHandler(event)"> <fx:Declarations> <fx:Array id="dp"> <fx:Object code="1" parentCode="0"/> <fx:Object code="2" parentCode="1"/> <fx:Object code="3" parentCode="1"/> <fx:Object code="4" parentCode="1"/> <fx:Object code="5" parentCode="2"/> <fx:Object code="6" parentCode="2"/> <fx:Object code="7" parentCode="3"/> </fx:Array> </fx:Declarations> <fx:Script> <![CDATA[ import mx.events.FlexEvent; protected function creationCompleteHandler(event:FlexEvent):void { var treeData:Object = {code:"0"}; convertToTreeData(dp, treeData); tree.dataProvider = treeData; } private function convertToTreeData(items:Array, parent:Object):void { for each(var item:Object in items) { if(item.parentCode == parent.code) { if(!parent.hasOwnProperty("children")) { parent.children = new Array(); } parent.children.push(item); convertToTreeData(items, item); } } } ]]> </fx:Script> <mx:Tree id="tree" width="100%" height="100%" labelField="code"/> </s:Application>
実行すると以下のようになります。
[SWF]http://public-blog-dev.s3.amazonaws.com/wp-content/uploads/2011/09/SampleTree3.swf, 500, 400[/SWF]
このサンプルを見るにはFlash Playerがインストールされている必要があります。
階層構造のデータを扱う場合はとても便利ですが、呼び出すたびに引数とローカル変数の領域をメモリ上に確保するので注意が必要です。